#pragma once

#include <string>
#include <unordered_map>

enum noTerminalToken{
  NTNULL = -1,
  NTINICIO,
  NTPROGRAM,    
  NTDECS,
  NTDEC,
  NTTY,
  NTEXP,
  NTVARDEC,
  NTCONTCOLON,
  NTTYPEID,
  NTLVALUE,
  NTCONTLVALUE,
  NTEXPS,
  NTCONTEXPS,
  NTELSE,
  NTTYFIELDS,
  NTCONTFIELDS,
  NTOP,
  NTPARAMS,
  NTCONTPARAMS,
  NTCONTEXP,
  NTARRAYEXP,
  NTREGEXP,
  NTINSTANCIAEXP,
  NTVAREXP,
  NTCALLFUNCEXP,
  NTCALLMETHEXP,
  NTOPMINUSEXP,
  NTOPEXP,
  NTOPPAREMEXP,
  NTASSIGNEXP,
  NTIFEXP,
  NTWHILEEXP,
  NTFOREXP,
  NTBREAKEXP,
  NTLETEXP,
  NTMENBROCONTLVALUE,
  NTINDICECONTLVALUE,
  NTTYPEDEC,
  NTFUNCDEC,
  NTARRAYTY,
  NTIDENTTY,
  NTINDICETY
};

#define LABEL(tipoeNo) {tipoeNo,#tipoeNo}

static std::unordered_map<int, std::string> tipoNoToLabel
{
  LABEL(NTINICIO),
  LABEL(NTPROGRAM),
  LABEL(NTDECS),
  LABEL(NTDEC),
  LABEL(NTTY),
  LABEL(NTEXP),
  LABEL(NTVARDEC),
  LABEL(NTCONTCOLON),
  LABEL(NTTYPEID),
  LABEL(NTLVALUE),
  LABEL(NTCONTLVALUE),
  LABEL(NTEXPS),
  LABEL(NTCONTEXPS),
  LABEL(NTELSE),
  LABEL(NTTYFIELDS),
  LABEL(NTCONTFIELDS),
  LABEL(NTOP),
  LABEL(NTPARAMS),
  LABEL(NTCONTPARAMS),
  LABEL(NTCONTEXP),
  LABEL(NTARRAYEXP),
  LABEL(NTREGEXP),
  LABEL(NTINSTANCIAEXP),
  LABEL(NTVAREXP),
  LABEL(NTCALLFUNCEXP),
  LABEL(NTCALLMETHEXP),
  LABEL(NTOPMINUSEXP),
  LABEL(NTOPEXP),
  LABEL(NTOPPAREMEXP),
  LABEL(NTASSIGNEXP),
  LABEL(NTIFEXP),
  LABEL(NTWHILEEXP),
  LABEL(NTFOREXP),
  LABEL(NTBREAKEXP),
  LABEL(NTLETEXP),
  LABEL(NTMENBROCONTLVALUE),
  LABEL(NTINDICECONTLVALUE),
  LABEL(NTTYPEDEC),
  LABEL(NTFUNCDEC),
  LABEL(NTARRAYTY),
  LABEL(NTIDENTTY),
  LABEL(NTINDICETY)
};

#undef LABEL

struct dadoToken{
	int row;
	int col;
	std::string value;
	std::string tipo;
	
};

struct tipoExpressao{
  std::string tipo;  
};
